package cn.xinfei.xdecision.common.service.enginex;

import cn.xinfei.xdecision.common.model.component.dependency.resp.DecisionComponentDependencyResp;
import cn.xinfei.xdecision.common.model.decisionflow.*;
import cn.xinfei.xdecision.common.model.enginex.po.EngineNode;
import cn.xinfei.xdecision.common.model.enginex.vo.ActionListVo;
import cn.xinfei.xdecision.common.model.enginex.vo.NodeVo;
import cn.xinfei.xdecision.common.model.enginex.vo.response.param.NodeTypeResponse;

import java.util.List;

/**
 * ClassName:EngineNodeServiceV3 <br/>
 * Description: 引擎节点接口. <br/>
 */
public interface EngineNodeService {

    /**
     * 新增决策流节点
     *
     * @param nodeSaveReqVo 节点信息
     * @return 节点信息
     */
    NodeRespVo saveEngineNode(NodeSaveReqVo nodeSaveReqVo);

    /**
     * 新增决策流节点
     *
     * @param nodeSaveReqVo 节点信息
     * @return 节点信息
     */
    EngineNode saveEngineNode(EngineNode engineNode);

    /**
     * 批量删除
     *
     * @param engineNodeIds 节点ids
     */
    void removeNodeAll(List<Long> engineNodeIds);

    /**
     * 删除决策流节点
     *
     * @param engineNodeId 节点id
     */
    void removeNode(Long engineNodeId);

    /**
     * 根据nodeId批量逻辑删除
     *
     * @param nodeIds 待删除的节点id
     * @return true/false
     */
    boolean removeNodesByIds(List<Long> nodeIds);

    /**
     * 更新nodeId更新节点信息
     *
     * @param engineNode 更新的节点信息实体
     */
    boolean updateById(EngineNode engineNode);

    boolean updateByNodeCodeAndVersionId(String nodeCode, Long versionId, EngineNode engineNode);

    /**
     * 更新节点属性
     */
    EngineNode updateNodeInfo(UpdateNodeInfoReqVo updateNodeInfoReqVo);

    /**
     * 根据engineCode+versionId更新节点坐标
     *
     * @param nodeVo nodeVo
     * @return true/false
     */
    boolean updateNodeForMove(NodeMoveReqVo nodeVo);

    /**
     * 根据engineCode+versionId更新节点名称
     *
     * @param nodeRenameReqVo nodeRenameReqVo
     * @return true/false
     */
    boolean renameNode(NodeRenameReqVo nodeRenameReqVo);

    /**
     * 节点连线，更新父节点nextNodeCodes、更新子节点parentId
     *
     * @param nodeLinkReqVo sourceNodeId targetNodeId
     * @return true/false
     */
    boolean link(NodeLinkReqVo nodeLinkReqVo);

    /**
     * 节点连线删除，更新父节点nextNodeCodes、更新子节点parentId，无父节点更新为-1
     *
     * @param nodeLinkReqVo sourceNodeId targetNodeId
     * @return true/false
     */
    boolean removeLink(NodeLinkReqVo nodeLinkReqVo);

    /**
     * 根据nodeId查询节点信息
     *
     * @param nodeId nodeId
     * @return 节点信息
     */
    EngineNode getNodeById(Long nodeId);

    /**
     * 根据决策流版本id查询决策流节点列表
     *
     * @param engineVersionId 决策流版本id
     * @return 决策流节点列表
     */
    List<EngineNode> getEngineNodeListByEngineVersionId(Long engineVersionId);

    /**
     * 根据engineCode+versionNo查询决策流节点列表
     *
     * @param nodeListReqVo nodeListReqVo
     * @return 决策流节点列表、maxOrder
     */
    NodeListRespVo getEngineNodeList(NodeListReqVo nodeListReqVo);

    /**
     * 查询决策流版本下节点最大序号
     *
     * @param versionId 决策流版本id
     * @return maxOrder
     */
    int getMaxNodeOrder(Long versionId);

    /**
     * 复制节点，不复制父子关系
     *
     * @param nodeSaveReqVo nodeSaveReqVo
     * @return true/false
     */
    String copy(Long nodeId);

    /**
     * 获取当前节点前面所有节点的输出信息
     *
     * @param nodeId
     * @return
     */
    List<NodeTypeResponse> getPreviousNodeOutput(NodeVo nodeVo);


    /**
     * 通过节点code获取依赖关系
     *
     * @param versionIds 节点版本ids
     * @return {@link EngineNode 决策流节点信息}
     */
    List<DecisionComponentDependencyResp> getByEngineVersionId(List<Long> versionIds);

    List<String> getFieldCodesByEngineVersionId(Long engineVersionId);

    List<ActionListVo> findActionListByServerType(Integer actionServerType);

//    /**
//     * 根据引擎code和版本id获取决策流锁
//     *
//     * @param engineCode 引擎code
//     * @param versionId  版本id
//     * @return {@link DecisionFlowLock 决策流锁}
//     */
//    DecisionFlowLock getDecisionFlowLock(String engineCode, Long versionId);
}